<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>中俊为 | we harmonyos</title>
    <meta name="generator" content="VuePress 1.9.7">
    <script>
          var _hmt = _hmt || [];
          (function() {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?39485dba914ae63b24732b6a90688f0b";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
          })();
      </script>
    <link rel="manifest" href="/manifest.webmanifest" crossorigin="use-credentials">
    <meta name="description" content="weharmonyos 鸿蒙论坛 鸿蒙注释 开源鸿蒙 鸿蒙源码 openharmony源码 HarmonyOS源码 HarmonyOS HarmonyOS生态 openharmony开发者文档 鸿蒙生态 鸿蒙系统 华为操作系统 鸿蒙研究站 开放原子开源基金会 百万汉字注解鸿蒙 百篇博客分析鸿蒙">
    <meta property="og:url" content="/blog/95.html">
    <meta property="og:site_name" content="中俊为 | we harmonyos">
    <meta property="og:description" content="本篇关键词：、、、 下载 &gt;&gt; 离线文档.鸿蒙内核源码分析(百篇博客分析.挖透鸿蒙内核).pdf.zip) 编译运行相关篇为: v84.02 鸿蒙内核源码分析(编译过程) | 简单案例说透中间过程; v85.03 鸿蒙内核源码分析(编译构建) | 编译鸿蒙防掉坑指南; v86.04 鸿蒙内核源码分析(GN语法) | 如何构建鸿蒙系统; v87.03 ">
    <meta property="og:type" content="article">
    <meta property="og:locale" content="en-US">
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:image:alt" content="中俊为 | we harmonyos">
    <meta name="theme-color" content="#46bd87">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
    
    <link rel="preload" href="/assets/css/0.styles.087eb7d3.css" as="style"><link rel="preload" href="/assets/js/app.9a8b95d8.js" as="script"><link rel="preload" href="/assets/js/vendors~layout-Layout.c1e797d4.js" as="script"><link rel="preload" href="/assets/js/vendors~layout-Blog~layout-Layout~layout-NotFound.f75cf258.js" as="script"><link rel="preload" href="/assets/js/page--6c2b97f0.ed46abea.js" as="script"><link rel="prefetch" href="/assets/js/160.a8046d43.js"><link rel="prefetch" href="/assets/js/161.29f8564f.js"><link rel="prefetch" href="/assets/js/162.249ee491.js"><link rel="prefetch" href="/assets/js/163.c57d1577.js"><link rel="prefetch" href="/assets/js/164.7a788aaa.js"><link rel="prefetch" href="/assets/js/165.c333afb2.js"><link rel="prefetch" href="/assets/js/166.9bcb7cd6.js"><link rel="prefetch" href="/assets/js/layout-Blog.4a9781d1.js"><link rel="prefetch" href="/assets/js/layout-Layout.7e277e0b.js"><link rel="prefetch" href="/assets/js/layout-NotFound.9326b14e.js"><link rel="prefetch" href="/assets/js/layout-Slide.8dd861e4.js"><link rel="prefetch" href="/assets/js/page--00854288.e2bc8e8a.js"><link rel="prefetch" href="/assets/js/page--00f8db0a.b2a35fe6.js"><link rel="prefetch" href="/assets/js/page--03ad6df0.d48f4c19.js"><link rel="prefetch" href="/assets/js/page--04b12ba8.e8add78d.js"><link rel="prefetch" href="/assets/js/page--070d2528.d24cd503.js"><link rel="prefetch" href="/assets/js/page--086560f0.a6be2844.js"><link rel="prefetch" href="/assets/js/page--090ad32d.fc7da3c3.js"><link rel="prefetch" href="/assets/js/page--0c054030.2886024e.js"><link rel="prefetch" href="/assets/js/page--0d9507c8.a27dee03.js"><link rel="prefetch" href="/assets/js/page--10bd3330.b5165172.js"><link rel="prefetch" href="/assets/js/page--1233b0b2.b5caca9c.js"><link rel="prefetch" href="/assets/js/page--13650e88.61330a2b.js"><link rel="prefetch" href="/assets/js/page--14c850b1.d9a40c31.js"><link rel="prefetch" href="/assets/js/page--15752630.25f9c756.js"><link rel="prefetch" href="/assets/js/page--19150570.58df8995.js"><link rel="prefetch" href="/assets/js/page--19ecf128.130d012b.js"><link rel="prefetch" href="/assets/js/page--1c48eaa8.9a689e30.js"><link rel="prefetch" href="/assets/js/page--1d4dfe96.bd551921.js"><link rel="prefetch" href="/assets/js/page--1dccf870.03d7d9cc.js"><link rel="prefetch" href="/assets/js/page--2074d3c8.06bf5706.js"><link rel="prefetch" href="/assets/js/page--22213c96.e703257a.js"><link rel="prefetch" href="/assets/js/page--2284eb70.514124de.js"><link rel="prefetch" href="/assets/js/page--22d0cd48.11ea1522.js"><link rel="prefetch" href="/assets/js/page--252cc6c8.f9acae83.js"><link rel="prefetch" href="/assets/js/page--2624cab0.4535fea2.js"><link rel="prefetch" href="/assets/js/page--269ff8f9.012e8ae6.js"><link rel="prefetch" href="/assets/js/page--26fcb668.35b2da5d.js"><link rel="prefetch" href="/assets/js/page--2958afe8.216913bc.js"><link rel="prefetch" href="/assets/js/page--2adcbdb0.6dcb4c27.js"><link rel="prefetch" href="/assets/js/page--2bb4a968.aac31797.js"><link rel="prefetch" href="/assets/js/page--2d849908.7bb4e817.js"><link rel="prefetch" href="/assets/js/page--2e10a2e8.42bef48d.js"><link rel="prefetch" href="/assets/js/page--2f94b0b0.0c993df5.js"><link rel="prefetch" href="/assets/js/page--2fe09288.77769dcb.js"><link rel="prefetch" href="/assets/js/page--323c8c08.254a5f78.js"><link rel="prefetch" href="/assets/js/page--33348ff0.a5f99eb0.js"><link rel="prefetch" href="/assets/js/page--340c7ba8.2c9570cb.js"><link rel="prefetch" href="/assets/js/page--34988588.8c8d0363.js"><link rel="prefetch" href="/assets/js/page--36687528.67d84e0d.js"><link rel="prefetch" href="/assets/js/page--37d6dfd6.88e9cd42.js"><link rel="prefetch" href="/assets/js/page--37ec82f0.5419c82d.js"><link rel="prefetch" href="/assets/js/page--37f7cf15.65f72e55.js"><link rel="prefetch" href="/assets/js/page--38c46ea8.5d5150f9.js"><link rel="prefetch" href="/assets/js/page--3a945e48.bf9758fb.js"><link rel="prefetch" href="/assets/js/page--3ab2204c.e08d6316.js"><link rel="prefetch" href="/assets/js/page--3b206828.d83e3926.js"><link rel="prefetch" href="/assets/js/page--3ca475f0.49e5acce.js"><link rel="prefetch" href="/assets/js/page--3cf057c8.8364331d.js"><link rel="prefetch" href="/assets/js/page--3f4c5148.587a8360.js"><link rel="prefetch" href="/assets/js/page--40445530.486bb516.js"><link rel="prefetch" href="/assets/js/page--411c40e8.2eedba0e.js"><link rel="prefetch" href="/assets/js/page--41a84ac8.f4a360a3.js"><link rel="prefetch" href="/assets/js/page--4220f8b5.19b4371f.js"><link rel="prefetch" href="/assets/js/page--43783a68.4faf0866.js"><link rel="prefetch" href="/assets/js/page--44fc4830.a160662c.js"><link rel="prefetch" href="/assets/js/page--45d433e8.560fef87.js"><link rel="prefetch" href="/assets/js/page--47a42388.052314b4.js"><link rel="prefetch" href="/assets/js/page--47d07816.66731286.js"><link rel="prefetch" href="/assets/js/page--48302d68.8d6493cf.js"><link rel="prefetch" href="/assets/js/page--49b43b30.e3684736.js"><link rel="prefetch" href="/assets/js/page--4a001d08.47f7ec45.js"><link rel="prefetch" href="/assets/js/page--4c5c1688.b7ec1f32.js"><link rel="prefetch" href="/assets/js/page--4d541a70.ee807705.js"><link rel="prefetch" href="/assets/js/page--4e2c0628.4f7105a4.js"><link rel="prefetch" href="/assets/js/page--4eb81008.725d26fe.js"><link rel="prefetch" href="/assets/js/page--5087ffa8.dac2aae0.js"><link rel="prefetch" href="/assets/js/page--520c0d70.2beedefb.js"><link rel="prefetch" href="/assets/js/page--52e3f928.2645087c.js"><link rel="prefetch" href="/assets/js/page--53cd0b44.96d4a285.js"><link rel="prefetch" href="/assets/js/page--54eb2c5e.27eb702b.js"><link rel="prefetch" href="/assets/js/page--553ff2a8.fba8ee4f.js"><link rel="prefetch" href="/assets/js/page--5686ab01.547b633c.js"><link rel="prefetch" href="/assets/js/page--56c40070.4e35708a.js"><link rel="prefetch" href="/assets/js/page--570fe248.2b301b36.js"><link rel="prefetch" href="/assets/js/page--596bdbc8.c74cd724.js"><link rel="prefetch" href="/assets/js/page--5a63dfb0.bbd49a9b.js"><link rel="prefetch" href="/assets/js/page--5bc7d548.eda26865.js"><link rel="prefetch" href="/assets/js/page--5f1bd2b0.e02cf88d.js"><link rel="prefetch" href="/assets/js/page--5ff3be68.b2b0e76e.js"><link rel="prefetch" href="/assets/js/page--624fb7e8.666fdc84.js"><link rel="prefetch" href="/assets/js/page--63d3c5b0.b587d38f.js"><link rel="prefetch" href="/assets/js/page--68d79a88.86f62e4d.js"><link rel="prefetch" href="/assets/js/page--6cc6a596.b3827451.js"><link rel="prefetch" href="/assets/js/page--6ea7a148.61a9bc10.js"><link rel="prefetch" href="/assets/js/page--70e38af0.eb8ffc53.js"><link rel="prefetch" href="/assets/js/page--7180d470.73a3a20e.js"><link rel="prefetch" href="/assets/js/page--752f83e8.d5c31640.js"><link rel="prefetch" href="/assets/js/page--778b7d68.5e8e5ea9.js"><link rel="prefetch" href="/assets/js/page--7bb76688.53e305e3.js"><link rel="prefetch" href="/assets/js/page--7c59a86a.ecf88c30.js"><link rel="prefetch" href="/assets/js/page--7df35030.cfa388f4.js"><link rel="prefetch" href="/assets/js/page--7e136008.230e9a15.js"><link rel="prefetch" href="/assets/js/page--89935db0.f79f9e25.js"><link rel="prefetch" href="/assets/js/page--96a322f0.412d537f.js"><link rel="prefetch" href="/assets/js/page--9b5b15f0.a5231547.js"><link rel="prefetch" href="/assets/js/page--a3b2e830.f4ba68fa.js"><link rel="prefetch" href="/assets/js/page--a86adb30.ec08486b.js"><link rel="prefetch" href="/assets/js/page--ad22ce30.4872eca4.js"><link rel="prefetch" href="/assets/js/page--b0c2ad70.8637057e.js"><link rel="prefetch" href="/assets/js/page--b57aa070.43215f9e.js"><link rel="prefetch" href="/assets/js/page--ba329370.b5f22d13.js"><link rel="prefetch" href="/assets/js/page--bdd272b0.aff1d1a9.js"><link rel="prefetch" href="/assets/js/page--c28a65b0.978514c4.js"><link rel="prefetch" href="/assets/js/page--c606edca.49d3396e.js"><link rel="prefetch" href="/assets/js/page--c74258b0.f85195bc.js"><link rel="prefetch" href="/assets/js/page--cae237f0.8a976cc1.js"><link rel="prefetch" href="/assets/js/page--cf9a2af0.7ad20ea2.js"><link rel="prefetch" href="/assets/js/page--d4521df0.a0a74934.js"><link rel="prefetch" href="/assets/js/page--d7f1fd30.160f138a.js"><link rel="prefetch" href="/assets/js/page--dca9f030.9127ab28.js"><link rel="prefetch" href="/assets/js/page--e161e330.34876a6f.js"><link rel="prefetch" href="/assets/js/page--e4f35ef4.690d3ccb.js"><link rel="prefetch" href="/assets/js/page--e501c270.8dc088ee.js"><link rel="prefetch" href="/assets/js/page--e9b9b570.b94764ed.js"><link rel="prefetch" href="/assets/js/page--ea4e0a70.94492571.js"><link rel="prefetch" href="/assets/js/page--ee71a870.b9944792.js"><link rel="prefetch" href="/assets/js/page--f21187b0.d00a5788.js"><link rel="prefetch" href="/assets/js/page--f6c97ab0.ecb91d64.js"><link rel="prefetch" href="/assets/js/page--fb816db0.c1f07c37.js"><link rel="prefetch" href="/assets/js/page--fcf2f51e.71000d71.js"><link rel="prefetch" href="/assets/js/page--ff214cf0.aaa8b0fc.js"><link rel="prefetch" href="/assets/js/page-GN.2f20b55f.js"><link rel="prefetch" href="/assets/js/page-GNFrequentlyAskedQuestions.24e61c26.js"><link rel="prefetch" href="/assets/js/page-GNLanguageandOperation.35e22ff2.js"><link rel="prefetch" href="/assets/js/page-GNQuickStartguide.7cd8e521.js"><link rel="prefetch" href="/assets/js/page-GNReference.1d5d0c6c.js"><link rel="prefetch" href="/assets/js/page-GNSimpleBuildExample.2eb0b7eb.js"><link rel="prefetch" href="/assets/js/page-GNStyleGuide.8a407135.js"><link rel="prefetch" href="/assets/js/page-GNU汇编教程.d208e4d7.js"><link rel="prefetch" href="/assets/js/page-GNvimsyntaxplugin.58d1459e.js"><link rel="prefetch" href="/assets/js/page-GN快速入门.b708bb6a.js"><link rel="prefetch" href="/assets/js/page-Home.97282d71.js"><link rel="prefetch" href="/assets/js/page-HowGNhandlescross-compiling.6ca64957.js"><link rel="prefetch" href="/assets/js/page-Introduction.292088e0.js"><link rel="prefetch" href="/assets/js/page-ninja快速入门.92729e64.js"><link rel="prefetch" href="/assets/js/page-《孙子兵法》全文.402792c5.js"><link rel="prefetch" href="/assets/js/page-《论语》全文.85da0da0.js"><link rel="prefetch" href="/assets/js/page-《诗经》全文.99ebeb52.js"><link rel="prefetch" href="/assets/js/page-《道德经》全文.43627e4e.js"><link rel="prefetch" href="/assets/js/page-两个文档.eb8dd1b7.js"><link rel="prefetch" href="/assets/js/page-主流站点覆盖定期同步更新.1ad02178.js"><link rel="prefetch" href="/assets/js/page-手机版电脑版.b5e8dfea.js"><link rel="prefetch" href="/assets/js/page-捐助方式.6ca91d44.js"><link rel="prefetch" href="/assets/js/page-来源LiteOS和LiteOS-A内核图解.8fa16705.js"><link rel="prefetch" href="/assets/js/page-电脑版手机版.67a0b4a4.js"><link rel="prefetch" href="/assets/js/page-编程语言相关书籍.d9adf7cb.js"><link rel="prefetch" href="/assets/js/page-鸿蒙内核源码分析.bbb451c7.js"><link rel="prefetch" href="/assets/js/vendors~flowchart.46b2de48.js"><link rel="prefetch" href="/assets/js/vendors~mermaid.627fb4be.js"><link rel="prefetch" href="/assets/js/vendors~photo-swipe.cbde97f9.js"><link rel="prefetch" href="/assets/js/vendors~reveal.77b21b7e.js">
    <link rel="stylesheet" href="/assets/css/0.styles.087eb7d3.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container has-navbar has-sidebar has-anchor"><header class="navbar"><!----> <div class="content__navbar-start"></div> <button title="Sidebar Button" class="sidebar-button"><span class="icon"></span></button> <a href="/" class="home-link router-link-active"><!----> <!----> <span class="site-name can-hide">中俊为 | we harmonyos</span></a> <!----> <div class="content__navbar-center"></div> <div class="links"><button tabindex="-1" aria-hidden="true" class="color-button"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="skin-icon"><path d="M224 800c0 9.6 3.2 44.8 6.4 54.4 6.4 48-48 76.8-48 76.8s80 41.6 147.2 0 134.4-134.4
        38.4-195.2c-22.4-12.8-41.6-19.2-57.6-19.2C259.2 716.8 227.2 761.6 224 800zM560 675.2l-32
        51.2c-51.2 51.2-83.2 32-83.2 32 25.6 67.2 0 112-12.8 128 25.6 6.4 51.2 9.6 80 9.6 54.4 0
        102.4-9.6 150.4-32l0 0c3.2 0 3.2-3.2 3.2-3.2 22.4-16 12.8-35.2
        6.4-44.8-9.6-12.8-12.8-25.6-12.8-41.6 0-54.4 60.8-99.2 137.6-99.2 6.4 0 12.8 0 22.4
        0 12.8 0 38.4 9.6 48-25.6 0-3.2 0-3.2 3.2-6.4 0-3.2 3.2-6.4 3.2-6.4 6.4-16 6.4-16 6.4-19.2
        9.6-35.2 16-73.6 16-115.2 0-105.6-41.6-198.4-108.8-268.8C704 396.8 560 675.2 560 675.2zM224
        419.2c0-28.8 22.4-51.2 51.2-51.2 28.8 0 51.2 22.4 51.2 51.2 0 28.8-22.4 51.2-51.2 51.2C246.4
        470.4 224 448 224 419.2zM320 284.8c0-22.4 19.2-41.6 41.6-41.6 22.4 0 41.6 19.2 41.6 41.6 0
        22.4-19.2 41.6-41.6 41.6C339.2 326.4 320 307.2 320 284.8zM457.6 208c0-12.8 12.8-25.6 25.6-25.6
        12.8 0 25.6 12.8 25.6 25.6 0 12.8-12.8 25.6-25.6 25.6C470.4 233.6 457.6 220.8 457.6 208zM128
        505.6C128 592 153.6 672 201.6 736c28.8-60.8 112-60.8 124.8-60.8-16-51.2 16-99.2
        16-99.2l316.8-422.4c-48-19.2-99.2-32-150.4-32C297.6 118.4 128 291.2 128 505.6zM764.8
        86.4c-22.4 19.2-390.4 518.4-390.4 518.4-22.4 28.8-12.8 76.8 22.4 99.2l9.6 6.4c35.2 22.4
        80 12.8 99.2-25.6 0 0 6.4-12.8 9.6-19.2 54.4-105.6 275.2-524.8 288-553.6
        6.4-19.2-3.2-32-19.2-32C777.6 76.8 771.2 80 764.8 86.4z"></path></svg> <div class="color-picker-menu" style="display:none;"><div class="theme-options"><ul class="themecolor-select"><label for="themecolor-select">Theme Color:</label> <li><span class="default-theme"></span></li> </ul> <div class="darkmode-toggle"><label for="darkmode-toggle" class="desc">Theme Mode:</label> <div class="darkmode-switch"><div class="item day"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon light-icon"><path d="M512 256a42.667 42.667 0 0 0 42.667-42.667V128a42.667 42.667 0 0 0-85.334 0v85.333A42.667 42.667 0 0 0 512 256zm384 213.333h-85.333a42.667 42.667 0 0 0 0 85.334H896a42.667 42.667 0 0 0 0-85.334zM256 512a42.667 42.667 0 0 0-42.667-42.667H128a42.667 42.667 0 0 0 0 85.334h85.333A42.667 42.667 0 0 0 256 512zm9.387-298.667a42.667 42.667 0 0 0-59.307 62.72l61.44 59.307a42.667 42.667 0 0 0 31.147 11.947 42.667 42.667 0 0 0 30.72-13.227 42.667 42.667 0 0 0 0-60.16zm459.946 133.974a42.667 42.667 0 0 0 29.44-11.947l61.44-59.307a42.667 42.667 0 0 0-57.6-62.72l-61.44 60.587a42.667 42.667 0 0 0 0 60.16 42.667 42.667 0 0 0 28.16 13.227zM512 768a42.667 42.667 0 0 0-42.667 42.667V896a42.667 42.667 0 0 0 85.334 0v-85.333A42.667 42.667 0 0 0 512 768zm244.48-79.36a42.667 42.667 0 0 0-59.307 61.44l61.44 60.587a42.667 42.667 0 0 0 29.44 11.946 42.667 42.667 0 0 0 30.72-12.8 42.667 42.667 0 0 0 0-60.586zm-488.96 0-61.44 59.307a42.667 42.667 0 0 0 0 60.586 42.667 42.667 0 0 0 30.72 12.8 42.667 42.667 0 0 0 28.587-10.666l61.44-59.307a42.667 42.667 0 0 0-59.307-61.44zM512 341.333A170.667 170.667 0 1 0 682.667 512 170.667 170.667 0 0 0 512 341.333z" fill="currentColor"></path></svg></div> <div class="item auto active"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon auto-icon"><path d="M460.864 539.072H564.8L510.592 376l-49.728 163.072zM872 362.368V149.504H659.648L510.528 0l-149.12 149.504H149.12v212.928L0 511.872l149.12 149.504v212.928h212.352l149.12 149.504 149.12-149.504h212.352V661.376l149.12-149.504L872 362.368zM614.464 693.12l-31.616-90.624H438.272l-31.616 90.624h-85.888l144.576-407.68h90.368l144.576 407.68h-85.824zm0 0" fill="currentColor"></path></svg></div> <div class="item night"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon dark-icon"><path d="M935.539 630.402c-11.43-11.432-28.674-14.739-43.531-8.354-46.734 20.103-96.363 30.297-147.508 30.297-99.59 0-193.221-38.784-263.64-109.203-108.637-108.637-139.61-270.022-78.908-411.148a39.497 39.497 0 0 0-51.886-51.887c-52.637 22.64-100.017 54.81-140.826 95.616-85.346 85.346-132.346 198.821-132.346 319.52 0 120.7 47.001 234.172 132.347 319.519S408.063 947.11 528.76 947.11c120.7 0 234.172-47.003 319.52-132.351 40.809-40.81 72.978-88.19 95.616-140.826a39.497 39.497 0 0 0-8.356-43.532z" fill="currentColor"></path></svg></div></div> <!----></div></div></div></button> <div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" class="nav-link router-link-active"><!---->
  首页
</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="文档中心" class="dropdown-title"><span class="title"><!---->
        文档中心
      </span> <span class="arrow"></span></button> <ul class="nav-dropdown"><li class="dropdown-item"><a href="http://open.weharmonyos.com/zh-cn/readme/Readme-CN.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  子系统
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><a href="http://open.weharmonyos.com/zh-cn/device-dev/website.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  南向
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><a href="http://open.weharmonyos.com/zh-cn/application-dev/website.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  北向
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="博客中心" class="dropdown-title"><span class="title"><!---->
        博客中心
      </span> <span class="arrow"></span></button> <ul class="nav-dropdown"><li class="dropdown-item"><a href="/blog/101.html" class="nav-link"><!---->
  总目录
</a></li><li class="dropdown-item"><a href="/blog/index/1_base.html" class="nav-link"><!---->
  基础知识
</a></li><li class="dropdown-item"><a href="/blog/index/2_process.html" class="nav-link"><!---->
  进程管理
</a></li><li class="dropdown-item"><a href="/blog/index/3_task.html" class="nav-link"><!---->
  任务管理
</a></li><li class="dropdown-item"><a href="/blog/index/4_mem.html" class="nav-link"><!---->
  内存管理
</a></li><li class="dropdown-item"><a href="/blog/index/5_ipc.html" class="nav-link"><!---->
  进程通讯
</a></li><li class="dropdown-item"><a href="/blog/index/6_fs.html" class="nav-link"><!---->
  文件系统
</a></li><li class="dropdown-item"><a href="/blog/index/7_hw.html" class="nav-link"><!---->
  软硬接口
</a></li><li class="dropdown-item"><a href="/blog/index/8_asm.html" class="nav-link"><!---->
  内核汇编
</a></li><li class="dropdown-item"><a href="/blog/index/9_run.html" class="nav-link"><!---->
  编译运行
</a></li><li class="dropdown-item"><a href="/blog/index/10_test.html" class="nav-link"><!---->
  调测工具
</a></li><li class="dropdown-item"><a href="/blog/index/0_so.html" class="nav-link"><!---->
  前因后果
</a></li><li class="dropdown-item"><a href="/extsite.html" class="nav-link"><!---->
  前往 &gt;&gt; 外站
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="论坛中心" class="dropdown-title"><span class="title"><!---->
        论坛中心
      </span> <span class="arrow"></span></button> <ul class="nav-dropdown"><li class="dropdown-item"><a href="http://bbs.weharmonyos.com" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  论坛首页
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><a href="http://bbs.weharmonyos.com/forum-42-1.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  问题建议
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="手册中心" class="dropdown-title"><span class="title"><!---->
        手册中心
      </span> <span class="arrow"></span></button> <ul class="nav-dropdown"><li class="dropdown-item"><a href="http://doxygen.weharmonyos.com/index.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  内核参考手册
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><a href="/compile/assembly.html" class="nav-link"><!---->
  gnu 汇编教程
</a></li><li class="dropdown-item"><a href="/compile/gn/docs/" class="nav-link"><!---->
  gn 参考手册
</a></li><li class="dropdown-item"><a href="/compile/ninja/Readme-CN.html" class="nav-link"><!---->
  ninja 参考手册
</a></li><li class="dropdown-item"><a href="/compile/fhs.html" class="nav-link"><!---->
  fhs 规范
</a></li></ul></div></div><div class="nav-item"><a href="/donate.html" class="nav-link"><!---->
  赞助中心
</a></div></nav> <!----> <!----> <!----> <div class="content__navbar-end"></div></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><!----> <!----> <div class="content__sidebar-top"></div> <nav class="sidebar-nav-links"><div class="nav-item"><a href="/" class="nav-link router-link-active"><!---->
  首页
</a></div><div class="nav-item"><div class="mobile-dropdown-wrapper"><button type="button" aria-label="文档中心" class="dropdown-title"><span class="title"><!---->
      文档中心
    </span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://open.weharmonyos.com/zh-cn/readme/Readme-CN.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  子系统
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="http://open.weharmonyos.com/zh-cn/device-dev/website.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  南向
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="http://open.weharmonyos.com/zh-cn/application-dev/website.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  北向
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="mobile-dropdown-wrapper"><button type="button" aria-label="博客中心" class="dropdown-title"><span class="title"><!---->
      博客中心
    </span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/101.html" class="nav-link"><!---->
  总目录
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/1_base.html" class="nav-link"><!---->
  基础知识
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/2_process.html" class="nav-link"><!---->
  进程管理
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/3_task.html" class="nav-link"><!---->
  任务管理
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/4_mem.html" class="nav-link"><!---->
  内存管理
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/5_ipc.html" class="nav-link"><!---->
  进程通讯
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/6_fs.html" class="nav-link"><!---->
  文件系统
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/7_hw.html" class="nav-link"><!---->
  软硬接口
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/8_asm.html" class="nav-link"><!---->
  内核汇编
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/9_run.html" class="nav-link"><!---->
  编译运行
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/10_test.html" class="nav-link"><!---->
  调测工具
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/0_so.html" class="nav-link"><!---->
  前因后果
</a></li><li class="dropdown-item"><!----> <a href="/extsite.html" class="nav-link"><!---->
  前往 &gt;&gt; 外站
</a></li></ul></div></div><div class="nav-item"><div class="mobile-dropdown-wrapper"><button type="button" aria-label="论坛中心" class="dropdown-title"><span class="title"><!---->
      论坛中心
    </span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://bbs.weharmonyos.com" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  论坛首页
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="http://bbs.weharmonyos.com/forum-42-1.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  问题建议
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="mobile-dropdown-wrapper"><button type="button" aria-label="手册中心" class="dropdown-title"><span class="title"><!---->
      手册中心
    </span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://doxygen.weharmonyos.com/index.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  内核参考手册
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="/compile/assembly.html" class="nav-link"><!---->
  gnu 汇编教程
</a></li><li class="dropdown-item"><!----> <a href="/compile/gn/docs/" class="nav-link"><!---->
  gn 参考手册
</a></li><li class="dropdown-item"><!----> <a href="/compile/ninja/Readme-CN.html" class="nav-link"><!---->
  ninja 参考手册
</a></li><li class="dropdown-item"><!----> <a href="/compile/fhs.html" class="nav-link"><!---->
  fhs 规范
</a></li></ul></div></div><div class="nav-item"><a href="/donate.html" class="nav-link"><!---->
  赞助中心
</a></div> <!----></nav> <!----> <div class="content__sidebar-center"></div> <ul class="sidebar-links"><li><a href="/blog/101.html" class="sidebar-link">总目录</a></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">基础知识 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">进程管理 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">任务管理 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">内存管理 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">通讯机制 | 14</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">文件系统 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">硬件架构 | 9</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">内核汇编 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable open"><!----> <span class="title">编译运行 | 13</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/blog/index/9_run.html" class="sidebar-link">本章目录</a></li><li><a href="/blog/84.html" class="sidebar-link">编译过程</a></li><li><a href="/blog/85.html" class="sidebar-link">编译构建</a></li><li><a href="/blog/86.html" class="sidebar-link">构建工具</a></li><li><a href="/blog/87.html" class="sidebar-link">忍者无敌</a></li><li><a href="/blog/88.html" class="sidebar-link">ELF格式</a></li><li><a href="/blog/89.html" class="sidebar-link">ELF解析</a></li><li><a href="/blog/90.html" class="sidebar-link">静态链接</a></li><li><a href="/blog/91.html" class="sidebar-link">重定位</a></li><li><a href="/blog/92.html" class="sidebar-link">动态链接</a></li><li><a href="/blog/93.html" class="sidebar-link">进程映像</a></li><li><a href="/blog/94.html" class="sidebar-link">应用启动</a></li><li><a href="/blog/95.html" aria-current="page" class="active sidebar-link">系统调用</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/blog/96.html" class="sidebar-link">VDSO</a></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">调测工具 | 4</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">前因后果 | 4</span> <span class="arrow right"></span></p> <!----></section></li></ul> <!----> <div class="content__sidebar-bottom"></div> <!----></aside> <main class="page"><nav class="breadcrumb disable"><!----></nav> <!----> <div class="content__page-top"></div> <div vocab="https://schema.org/" typeof="Article" class="page-title"><h1><!----> <span property="headline"></span></h1> <div class="page-info"><!----> </div> <!----> <hr></div> <div class="anchor-place-holder"><aside id="anchor"><div class="anchor-wrapper"><ul class="anchor-list"><li class="anchor"><a href="/blog/95.html#本篇说清楚系统调用" class="anchor-link heading3"><div>本篇说清楚系统调用</div></a></li><li class="anchor"><a href="/blog/95.html#七段追踪代码-逐个分析" class="anchor-link heading3"><div>七段追踪代码，逐个分析</div></a></li><li class="anchor"><a href="/blog/95.html#_1-应用程序-main" class="anchor-link heading3"><div>1.应用程序 main</div></a></li><li class="anchor"><a href="/blog/95.html#_2-mq-open-发起系统调用" class="anchor-link heading3"><div>2. mq_open 发起系统调用</div></a></li><li class="anchor"><a href="/blog/95.html#_3-syscall" class="anchor-link heading3"><div>3. syscall</div></a></li><li class="anchor"><a href="/blog/95.html#_4-svc-0" class="anchor-link heading3"><div>4. svc 0</div></a></li><li class="anchor"><a href="/blog/95.html#_5-osexceptswihdl" class="anchor-link heading3"><div>5. _osExceptSwiHdl</div></a></li><li class="anchor"><a href="/blog/95.html#_6-osarma32syscallhandle" class="anchor-link heading3"><div>6. OsArmA32SyscallHandle</div></a></li><li class="anchor"><a href="/blog/95.html#_7-sysmqopen" class="anchor-link heading3"><div>7. SysMqOpen</div></a></li><li class="anchor"><a href="/blog/95.html#百文说内核-抓住主脉络" class="anchor-link heading3"><div>百文说内核 | 抓住主脉络</div></a></li><li class="anchor"><a href="/blog/95.html#百万注源码-处处扣细节" class="anchor-link heading3"><div>百万注源码 | 处处扣细节</div></a></li><li class="anchor"><a href="/blog/95.html#关注不迷路-代码即人生" class="anchor-link heading3"><div>关注不迷路 | 代码即人生</div></a></li></ul></div></aside></div> <!----> <div class="content__content-top"></div> <div class="theme-default-content content__default"><p>本篇关键词：、、、</p> <p><a href="https://weharmony.gitee.io/blog/95.html" target="_blank" rel="noopener noreferrer"><img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/index/95.png" alt=""></a></p> <p><a href="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/pdf/%E9%B8%BF%E8%92%99%E5%86%85%E6%A0%B8%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90(%E7%99%BE%E7%AF%87%E5%8D%9A%E5%AE%A2%E5%88%86%E6%9E%90.%E6%8C%96%E9%80%8F%E9%B8%BF%E8%92%99%E5%86%85%E6%A0%B8).zip" target="_blank" rel="noopener noreferrer">下载 &gt;&gt; 离线文档.鸿蒙内核源码分析(百篇博客分析.挖透鸿蒙内核).pdf</a></p> <p>编译运行相关篇为:</p> <ul><li><a href="http://weharmonyos.com/blog/84.html" target="_blank" rel="noopener noreferrer">v84.02 鸿蒙内核源码分析(编译过程) | 简单案例说透中间过程</a></li> <li><a href="http://weharmonyos.com/blog/85.html" target="_blank" rel="noopener noreferrer">v85.03 鸿蒙内核源码分析(编译构建) | 编译鸿蒙防掉坑指南</a></li> <li><a href="http://weharmonyos.com/blog/86.html" target="_blank" rel="noopener noreferrer">v86.04 鸿蒙内核源码分析(GN语法) | 如何构建鸿蒙系统</a></li> <li><a href="http://weharmonyos.com/blog/87.html" target="_blank" rel="noopener noreferrer">v87.03 鸿蒙内核源码分析(忍者无敌) | 忍者的特点就是一个字</a></li> <li><a href="http://weharmonyos.com/blog/88.html" target="_blank" rel="noopener noreferrer">v88.04 鸿蒙内核源码分析(ELF格式) | 应用程序入口并非main</a></li> <li><a href="http://weharmonyos.com/blog/89.html" target="_blank" rel="noopener noreferrer">v89.03 鸿蒙内核源码分析(ELF解析) | 敢忘了她姐俩你就不是银</a></li> <li><a href="http://weharmonyos.com/blog/90.html" target="_blank" rel="noopener noreferrer">v90.04 鸿蒙内核源码分析(静态链接) | 一个小项目看中间过程</a></li> <li><a href="http://weharmonyos.com/blog/91.html" target="_blank" rel="noopener noreferrer">v91.04 鸿蒙内核源码分析(重定位) | 与国际接轨的对外发言人</a></li> <li><a href="http://weharmonyos.com/blog/92.html" target="_blank" rel="noopener noreferrer">v92.01 鸿蒙内核源码分析(动态链接) | 正在制作中 ... </a></li> <li><a href="http://weharmonyos.com/blog/93.html" target="_blank" rel="noopener noreferrer">v93.05 鸿蒙内核源码分析(进程映像) | 程序是如何被加载运行的</a></li> <li><a href="http://weharmonyos.com/blog/94.html" target="_blank" rel="noopener noreferrer">v94.01 鸿蒙内核源码分析(应用启动) | 正在制作中 ... </a></li> <li><a href="http://weharmonyos.com/blog/95.html" target="_blank" rel="noopener noreferrer">v95.06 鸿蒙内核源码分析(系统调用) | 开发者永远的口头禅</a></li> <li><a href="http://weharmonyos.com/blog/96.html" target="_blank" rel="noopener noreferrer">v96.01 鸿蒙内核源码分析(VDSO) | 正在制作中 ... </a></li></ul> <h3 id="本篇说清楚系统调用">本篇说清楚系统调用</h3> <p>读本篇之前建议先读v08。xx 鸿蒙内核源码分析(总目录)  工作模式篇。</p> <p>本篇通过一张图和七段代码详细说明系统调用的整个过程，代码一捅到底，直到汇编层再也捅不下去。
先看图，这里的模式可以理解为空间，因为模式不同运行的栈空间就不一样。</p> <p><img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/37/syscall.png" alt=""></p> <p><strong>过程解读</strong></p> <ul><li>在应用层<code>main</code>中使用系统调用<code>mq_open</code>(posix标准接口)</li> <li><code>mq_open</code>被封装在库中，这里直接看库里的代码。</li> <li><code>mq_open</code>中调用<code>syscall</code>，将参数传给寄出器 <code>R7，R0~R6</code></li> <li><code>SVC 0</code> 完成用户模式到内核模式(SVC)的切换</li> <li><code>_osExceptSwiHdl</code>运行在svc模式下。</li> <li>PC寄存器直接指向<code>_osExceptSwiHdl</code>处取指令。</li> <li><code>_osExceptSwiHdl</code>是汇编代码，先保存用户模式现场(R0~R12寄存器)，并调用<code>OsArmA32SyscallHandle</code>完成系统调用</li> <li><code>OsArmA32SyscallHandle</code>中通过系统调用号(保存在R7寄存器)查询对应的注册函数<code>SYS_mq_open</code></li> <li><code>SYS_mq_open</code>是本次系统调用的实现函数，完成后return回到<code>OsArmA32SyscallHandle</code></li> <li><code>OsArmA32SyscallHandle</code>再return回到<code>_osExceptSwiHdl</code></li> <li><code>_osExceptSwiHdl</code>恢复用户模式现场(R0~R12寄存器)</li> <li>从内核模式(SVC)切回到用户模式，PC寄存器也切回用户现场。</li> <li>由此完成整个系统调用全过程</li></ul> <h3 id="七段追踪代码-逐个分析">七段追踪代码，逐个分析</h3> <h3 id="_1-应用程序-main">1.应用程序 main</h3> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
	<span class="token keyword">char</span> mqname<span class="token punctuation">[</span>NAMESIZE<span class="token punctuation">]</span>， msgrv1<span class="token punctuation">[</span>BUFFER<span class="token punctuation">]</span>， msgrv2<span class="token punctuation">[</span>BUFFER<span class="token punctuation">]</span><span class="token punctuation">;</span>
	<span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>msgptr1 <span class="token operator">=</span> <span class="token string">&quot;test message1&quot;</span><span class="token punctuation">;</span>
	<span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>msgptr2 <span class="token operator">=</span> <span class="token string">&quot;test message2 with differnet length&quot;</span><span class="token punctuation">;</span>
	<span class="token class-name">mqd_t</span> mqdes<span class="token punctuation">;</span>
	<span class="token keyword">int</span> prio1 <span class="token operator">=</span> <span class="token number">1</span>， prio2 <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
	<span class="token keyword">struct</span> <span class="token class-name">timespec</span> ts<span class="token punctuation">;</span>
	<span class="token keyword">struct</span> <span class="token class-name">mq_attr</span> attr<span class="token punctuation">;</span>
	<span class="token keyword">int</span> unresolved <span class="token operator">=</span> <span class="token number">0</span>， failure <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
	<span class="token function">sprintf</span><span class="token punctuation">(</span>mqname， <span class="token string">&quot;/&quot;</span> FUNCTION <span class="token string">&quot;_&quot;</span> TEST <span class="token string">&quot;_%d&quot;</span>， <span class="token function">getpid</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	attr<span class="token punctuation">.</span>mq_msgsize <span class="token operator">=</span> BUFFER<span class="token punctuation">;</span>
	attr<span class="token punctuation">.</span>mq_maxmsg <span class="token operator">=</span> BUFFER<span class="token punctuation">;</span>
	mqdes <span class="token operator">=</span> <span class="token function">mq_open</span><span class="token punctuation">(</span>mqname， O_CREAT <span class="token operator">|</span> O_RDWR， S_IRUSR <span class="token operator">|</span> S_IWUSR， <span class="token operator">&amp;</span>attr<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>mqdes <span class="token operator">==</span> <span class="token punctuation">(</span><span class="token class-name">mqd_t</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
		<span class="token function">perror</span><span class="token punctuation">(</span>ERROR_PREFIX <span class="token string">&quot;mq_open&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		unresolved <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">mq_send</span><span class="token punctuation">(</span>mqdes， msgptr1， <span class="token function">strlen</span><span class="token punctuation">(</span>msgptr1<span class="token punctuation">)</span>， prio1<span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
		<span class="token function">perror</span><span class="token punctuation">(</span>ERROR_PREFIX <span class="token string">&quot;mq_send&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		unresolved <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
	<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">&quot;Test PASSED\n&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">return</span> PTS_PASS<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br></div></div><h3 id="_2-mq-open-发起系统调用">2. mq_open 发起系统调用</h3> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token class-name">mqd_t</span> <span class="token function">mq_open</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>name， <span class="token keyword">int</span> flags， <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
	<span class="token class-name">mode_t</span> mode <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
	<span class="token keyword">struct</span> <span class="token class-name">mq_attr</span> <span class="token operator">*</span>attr <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">*</span>name <span class="token operator">==</span> <span class="token char">'/'</span><span class="token punctuation">)</span> name<span class="token operator">++</span><span class="token punctuation">;</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>flags <span class="token operator">&amp;</span> O_CREAT<span class="token punctuation">)</span> <span class="token punctuation">{</span>
		va_list ap<span class="token punctuation">;</span>
		<span class="token function">va_start</span><span class="token punctuation">(</span>ap， flags<span class="token punctuation">)</span><span class="token punctuation">;</span>
		mode <span class="token operator">=</span> <span class="token function">va_arg</span><span class="token punctuation">(</span>ap， <span class="token class-name">mode_t</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		attr <span class="token operator">=</span> <span class="token function">va_arg</span><span class="token punctuation">(</span>ap， <span class="token keyword">struct</span> <span class="token class-name">mq_attr</span> <span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token function">va_end</span><span class="token punctuation">(</span>ap<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
	<span class="token keyword">return</span> <span class="token function">syscall</span><span class="token punctuation">(</span>SYS_mq_open， name， flags， mode， attr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><p><strong>解读</strong></p> <ul><li><code>SYS_mq_open</code> 是真正的系统调用函数，对应一个系统调用号<code>__NR_mq_open</code>，通过宏<code>SYSCALL_HAND_DE</code>F将<code>SysMqOpen</code>注册到<code>g_syscallHandle</code>中。</li></ul> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token keyword">static</span> UINTPTR g_syscallHandle<span class="token punctuation">[</span>SYS_CALL_NUM<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>	<span class="token comment">//系统调用入口函数注册</span>
<span class="token keyword">static</span> UINT8 g_syscallNArgs<span class="token punctuation">[</span><span class="token punctuation">(</span>SYS_CALL_NUM <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">/</span> NARG_PER_BYTE<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token comment">//保存系统调用对应的参数数量</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name function">SYSCALL_HAND_DEF</span><span class="token expression"><span class="token punctuation">(</span>id， fun， rType， nArg<span class="token punctuation">)</span>                                             </span><span class="token punctuation">\</span>
    <span class="token expression"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token operator">&lt;</span> SYS_CALL_NUM<span class="token punctuation">)</span> <span class="token punctuation">{</span>                                                             </span><span class="token punctuation">\</span>
        <span class="token expression">g_syscallHandle<span class="token punctuation">[</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>UINTPTR<span class="token punctuation">)</span><span class="token punctuation">(</span>fun<span class="token punctuation">)</span><span class="token punctuation">;</span>                                            </span><span class="token punctuation">\</span>
        <span class="token expression">g_syscallNArgs<span class="token punctuation">[</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token operator">/</span> NARG_PER_BYTE<span class="token punctuation">]</span> <span class="token operator">|=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">1</span><span class="token punctuation">)</span> ？ <span class="token punctuation">(</span>nArg<span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> NARG_BITS ：<span class="token punctuation">(</span>nArg<span class="token punctuation">)</span><span class="token punctuation">;</span> </span><span class="token punctuation">\</span>
    <span class="token expression"><span class="token punctuation">}</span>                                                                                      </span><span class="token punctuation">\</span>
</span>
    <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&quot;syscall_lookup.h&quot;</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">SYSCALL_HAND_DEF</span></span>

<span class="token function">SYSCALL_HAND_DEF</span><span class="token punctuation">(</span>__NR_mq_open， SysMqOpen， <span class="token class-name">mqd_t</span>， ARG_NUM_4<span class="token punctuation">)</span>  
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><ul><li><code>g_syscallNArgs</code>为注册函数的参数个数，也会一块记录下来。</li> <li>四个参数为 SYS_mq_open的四个参数，后续将保存在R0~R3寄存器中</li></ul> <h3 id="_3-syscall">3. syscall</h3> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token keyword">long</span> <span class="token function">syscall</span><span class="token punctuation">(</span><span class="token keyword">long</span> n， <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
	va_list ap<span class="token punctuation">;</span>
	<span class="token class-name">syscall_arg_t</span> a，b，c，d，e，f<span class="token punctuation">;</span>
	<span class="token function">va_start</span><span class="token punctuation">(</span>ap， n<span class="token punctuation">)</span><span class="token punctuation">;</span>
	a<span class="token operator">=</span><span class="token function">va_arg</span><span class="token punctuation">(</span>ap， <span class="token class-name">syscall_arg_t</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	b<span class="token operator">=</span><span class="token function">va_arg</span><span class="token punctuation">(</span>ap， <span class="token class-name">syscall_arg_t</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	c<span class="token operator">=</span><span class="token function">va_arg</span><span class="token punctuation">(</span>ap， <span class="token class-name">syscall_arg_t</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	d<span class="token operator">=</span><span class="token function">va_arg</span><span class="token punctuation">(</span>ap， <span class="token class-name">syscall_arg_t</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	e<span class="token operator">=</span><span class="token function">va_arg</span><span class="token punctuation">(</span>ap， <span class="token class-name">syscall_arg_t</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	f<span class="token operator">=</span><span class="token function">va_arg</span><span class="token punctuation">(</span>ap， <span class="token class-name">syscall_arg_t</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//最多6个参数</span>
	<span class="token function">va_end</span><span class="token punctuation">(</span>ap<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">return</span> <span class="token function">__syscall_ret</span><span class="token punctuation">(</span><span class="token function">__syscall</span><span class="token punctuation">(</span>n，a，b，c，d，e，f<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">//4个参数的系统调用时底层处理</span>
<span class="token keyword">static</span> <span class="token keyword">inline</span> <span class="token keyword">long</span> <span class="token function">__syscall4</span><span class="token punctuation">(</span><span class="token keyword">long</span> n， <span class="token keyword">long</span> a， <span class="token keyword">long</span> b， <span class="token keyword">long</span> c， <span class="token keyword">long</span> d<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
	<span class="token keyword">register</span> <span class="token keyword">long</span> a7 <span class="token function">__asm__</span><span class="token punctuation">(</span><span class="token string">&quot;a7&quot;</span><span class="token punctuation">)</span> <span class="token operator">=</span> n<span class="token punctuation">;</span> <span class="token comment">//将系统调用号保存在R7寄存器</span>
	<span class="token keyword">register</span> <span class="token keyword">long</span> a0 <span class="token function">__asm__</span><span class="token punctuation">(</span><span class="token string">&quot;a0&quot;</span><span class="token punctuation">)</span> <span class="token operator">=</span> a<span class="token punctuation">;</span> <span class="token comment">//R0</span>
	<span class="token keyword">register</span> <span class="token keyword">long</span> a1 <span class="token function">__asm__</span><span class="token punctuation">(</span><span class="token string">&quot;a1&quot;</span><span class="token punctuation">)</span> <span class="token operator">=</span> b<span class="token punctuation">;</span> <span class="token comment">//R1</span>
	<span class="token keyword">register</span> <span class="token keyword">long</span> a2 <span class="token function">__asm__</span><span class="token punctuation">(</span><span class="token string">&quot;a2&quot;</span><span class="token punctuation">)</span> <span class="token operator">=</span> c<span class="token punctuation">;</span> <span class="token comment">//R2</span>
	<span class="token keyword">register</span> <span class="token keyword">long</span> a3 <span class="token function">__asm__</span><span class="token punctuation">(</span><span class="token string">&quot;a3&quot;</span><span class="token punctuation">)</span> <span class="token operator">=</span> d<span class="token punctuation">;</span> <span class="token comment">//R3</span>
	<span class="token function">__asm_syscall</span><span class="token punctuation">(</span><span class="token string">&quot;r&quot;</span><span class="token punctuation">(</span>a7<span class="token punctuation">)</span>， <span class="token string">&quot;0&quot;</span><span class="token punctuation">(</span>a0<span class="token punctuation">)</span>， <span class="token string">&quot;r&quot;</span><span class="token punctuation">(</span>a1<span class="token punctuation">)</span>， <span class="token string">&quot;r&quot;</span><span class="token punctuation">(</span>a2<span class="token punctuation">)</span>， <span class="token string">&quot;r&quot;</span><span class="token punctuation">(</span>a3<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br></div></div><p><strong>解读</strong></p> <ul><li>可变参数实现所有系统调用的参数的管理，可以看出，在鸿蒙内核中系统调用的参数最多不能大于6个</li> <li>R7寄存器保存了系统调用号，R0~R5保存具体每个参数</li> <li>可变参数的具体实现后续有其余篇幅详细介绍，敬请关注。</li></ul> <h3 id="_4-svc-0">4. svc 0</h3> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token comment">//切到SVC模式</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name function">__asm_syscall</span><span class="token expression"><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token keyword">do</span> <span class="token punctuation">{</span> </span><span class="token punctuation">\</span>
	<span class="token expression">__asm__ <span class="token function">__volatile__</span> <span class="token punctuation">(</span> </span><span class="token string">&quot;svc 0&quot;</span> <span class="token punctuation">\</span>
	<span class="token expression"><span class="token operator">:</span> </span><span class="token string">&quot;=r&quot;</span><span class="token expression"><span class="token punctuation">(</span>x0<span class="token punctuation">)</span> <span class="token operator">:</span> __VA_ARGS__ <span class="token operator">:</span> </span><span class="token string">&quot;memory&quot;</span><span class="token expression">， </span><span class="token string">&quot;cc&quot;</span><span class="token expression"><span class="token punctuation">)</span><span class="token punctuation">;</span> </span><span class="token punctuation">\</span>
	<span class="token expression"><span class="token keyword">return</span> x0<span class="token punctuation">;</span> </span><span class="token punctuation">\</span>
	<span class="token expression"><span class="token punctuation">}</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span></span></span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p>看不太懂的没关系，这里我们只需要记住：系统调用号存放在r7寄存器，参数存放在r0，r1，r2寄存器中，返回值最终会存放在寄存器r0中</p> <p><img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/37/operModes.png" alt=""> <img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/37/vectors.png" alt=""></p> <div class="language-c line-numbers-mode"><pre class="language-c"><code>    b   reset_vector            @开机代码
    b   _osExceptUndefInstrHdl 	@异常处理之CPU碰到不认识的指令
    b   _osExceptSwiHdl			@异常处理之<span class="token operator">:</span>软中断
    b   _osExceptPrefetchAbortHdl	@异常处理之<span class="token operator">:</span>取指异常
    b   _osExceptDataAbortHdl		@异常处理之<span class="token operator">:</span>数据异常
    b   _osExceptAddrAbortHdl		@异常处理之<span class="token operator">:</span>地址异常
    b   OsIrqHandler				@异常处理之<span class="token operator">:</span>硬中断
    b   _osExceptFiqHdl				@异常处理之<span class="token operator">:</span>快中断
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p><strong>解读</strong></p> <ul><li><code>svc</code> 全称是 SuperVisor Call，完成工作模式的切换。不管之前是7个模式中的哪个模式，统一都切到<code>SVC</code>管理模式。但你也许会好奇，ARM软中断不是用<code>SWI</code>吗，这里怎么变成了<code>SVC</code>了，请看下面一段话，是从ARM官网翻译的：
<blockquote><p>SVC
超级用户调用。
语法
SVC{cond} #immed
其中：
cond
是一个可选的条件代码（请参阅条件执行）。
immed
是一个表达式，其取值为以下范围内的一个整数：
在 ARM 指令中为 0 到 224–1（24 位值）
在 16 位 Thumb 指令中为 0-255（8 位值）。
用法
SVC 指令会引发一个异常。 这意味着处理器模式会更改为超级用户模式，CPSR 会保存到超级用户模式 SPSR，并且执行会跳转到 SVC 向量（请参阅《开发指南》中的第 6 章 处理处理器异常）。
处理器会忽略 immed。 但异常处理程序会获取它，借以确定所请求的服务。
Note
作为 ARM 汇编语言开发成果的一部分，SWI 指令已重命名为 SVC。 在此版本的 RVCT 中，SWI 指令反汇编为 SVC，并提供注释以指明这是以前的 SWI。
条件标记
此指令不更改标记。
体系结构
此 ARM 指令可用于所有版本的 ARM 体系结构。</p></blockquote></li> <li>而软中断对应的处理函数为 <code>_osExceptSwiHdl</code>，即PC寄存器将跳到<code>_osExceptSwiHdl</code>执行</li></ul> <h3 id="_5-osexceptswihdl">5. _osExceptSwiHdl</h3> <div class="language-c line-numbers-mode"><pre class="language-c"><code>@ Description<span class="token operator">:</span> Software interrupt exception handler
_osExceptSwiHdl<span class="token operator">:</span> @软中断异常处理
    @保存任务上下文<span class="token punctuation">(</span>TaskContext<span class="token punctuation">)</span> 开始<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> 一定要对照TaskContext来理解
    SUB     SP， SP， #<span class="token punctuation">(</span><span class="token number">4</span> <span class="token operator">*</span> <span class="token number">16</span><span class="token punctuation">)</span>	@先申请<span class="token number">16</span>个栈空间用于处理本次软中断
    STMIA   SP， <span class="token punctuation">{</span>R0<span class="token operator">-</span>R12<span class="token punctuation">}</span>		@TaskContext<span class="token punctuation">.</span>R<span class="token punctuation">[</span>GEN_REGS_NUM<span class="token punctuation">]</span> STMIA从左到右执行，先放R0 <span class="token punctuation">.</span><span class="token punctuation">.</span> R12
    MRS     R3， SPSR			@读取本模式下的SPSR值
    MOV     R4， LR				@保存回跳寄存器LR

    AND     R1， R3， #CPSR_MASK_MODE                          @ Interrupted mode 获取中断模式
    CMP     R1， #CPSR_USER_MODE                              @ User mode	是否为用户模式
    BNE     OsKernelSVCHandler                               @ Branch <span class="token keyword">if</span> not user mode 非用户模式下跳转
	@ 当为用户模式时，获取SP和LR寄出去值
    @ we enter from user mode， we need get the values of  USER mode <span class="token function">r13</span><span class="token punctuation">(</span>sp<span class="token punctuation">)</span> and <span class="token function">r14</span><span class="token punctuation">(</span>lr<span class="token punctuation">)</span><span class="token punctuation">.</span>
    @ stmia with <span class="token operator">^</span> will <span class="token keyword">return</span> the user mode <span class="token function">registers</span> <span class="token punctuation">(</span>provided that r15 is not in the <span class="token keyword">register</span> list<span class="token punctuation">)</span><span class="token punctuation">.</span>
    MOV     R0， SP											 @获取SP值，R0将作为OsArmA32SyscallHandle的参数
    STMFD   SP<span class="token operator">!</span>， <span class="token punctuation">{</span>R3<span class="token punctuation">}</span>                                        @ Save the CPSR 入栈保存CPSR值 <span class="token operator">=</span><span class="token operator">&gt;</span> TaskContext<span class="token punctuation">.</span>regPSR
    ADD     R3， SP， #<span class="token punctuation">(</span><span class="token number">4</span> <span class="token operator">*</span> <span class="token number">17</span><span class="token punctuation">)</span>                                @ Offset to pc<span class="token operator">/</span>cpsr storage 跳到PC<span class="token operator">/</span>CPSR存储位置
    STMFD   R3<span class="token operator">!</span>， <span class="token punctuation">{</span>R4<span class="token punctuation">}</span>                                        @ Save the CPSR and <span class="token function">r15</span><span class="token punctuation">(</span>pc<span class="token punctuation">)</span> 保存LR寄存器 <span class="token operator">=</span><span class="token operator">&gt;</span> TaskContext<span class="token punctuation">.</span>PC
    STMFD   R3， <span class="token punctuation">{</span>R13， R14<span class="token punctuation">}</span><span class="token operator">^</span>                                  @ Save user mode <span class="token function">r13</span><span class="token punctuation">(</span>sp<span class="token punctuation">)</span> and <span class="token function">r14</span><span class="token punctuation">(</span>lr<span class="token punctuation">)</span> 从右向左 保存 <span class="token operator">=</span><span class="token operator">&gt;</span> TaskContext<span class="token punctuation">.</span>LR和SP
    SUB     SP， SP， #<span class="token number">4</span>										 @ <span class="token operator">=</span><span class="token operator">&gt;</span> TaskContext<span class="token punctuation">.</span>resved
    PUSH_FPU_REGS R1	@保存中断模式<span class="token punctuation">(</span>用户模式模式<span class="token punctuation">)</span>											
	@保存任务上下文<span class="token punctuation">(</span>TaskContext<span class="token punctuation">)</span> 结束
    MOV     FP， #<span class="token number">0</span>                                           @ Init frame pointer
    CPSIE   I	@开中断，表明在系统调用期间可响应中断
    BLX     OsArmA32SyscallHandle	<span class="token comment">/*交给C语言处理系统调用，参数为R0，指向TaskContext的开始位置*/</span>
    CPSID   I	@执行后续指令前必须先关中断
	@恢复任务上下文<span class="token punctuation">(</span>TaskContext<span class="token punctuation">)</span> 开始
    POP_FPU_REGS R1											 @弹出FP值给R1
    ADD     SP， SP，#<span class="token number">4</span>										 @ 定位到保存旧SPSR值的位置
    LDMFD   SP<span class="token operator">!</span>， <span class="token punctuation">{</span>R3<span class="token punctuation">}</span>                                        @ Fetch the <span class="token keyword">return</span> SPSR 弹出旧SPSR值
    MSR     SPSR_cxsf， R3                                    @ Set the <span class="token keyword">return</span> mode SPSR 恢复该模式下的SPSR值

    @ we are leaving to user mode， we need to restore the values of USER mode <span class="token function">r13</span><span class="token punctuation">(</span>sp<span class="token punctuation">)</span> and <span class="token function">r14</span><span class="token punctuation">(</span>lr<span class="token punctuation">)</span><span class="token punctuation">.</span>
    @ ldmia with <span class="token operator">^</span> will <span class="token keyword">return</span> the user mode <span class="token function">registers</span> <span class="token punctuation">(</span>provided that r15 is not in the <span class="token keyword">register</span> list<span class="token punctuation">)</span>

    LDMFD   SP<span class="token operator">!</span>， <span class="token punctuation">{</span>R0<span class="token operator">-</span>R12<span class="token punctuation">}</span>									 @恢复R0<span class="token operator">-</span>R12寄存器
    LDMFD   SP， <span class="token punctuation">{</span>R13， R14<span class="token punctuation">}</span><span class="token operator">^</span>                                  @ Restore user mode R13<span class="token operator">/</span>R14 恢复用户模式的R13<span class="token operator">/</span>R14寄存器
    ADD     SP， SP， #<span class="token punctuation">(</span><span class="token number">2</span> <span class="token operator">*</span> <span class="token number">4</span><span class="token punctuation">)</span>								 @定位到保存旧PC值的位置
    LDMFD   SP<span class="token operator">!</span>， <span class="token punctuation">{</span>PC<span class="token punctuation">}</span><span class="token operator">^</span>                                       @ Return to user 切回用户模式运行
	@恢复任务上下文<span class="token punctuation">(</span>TaskContext<span class="token punctuation">)</span> 结束

OsKernelSVCHandler<span class="token operator">:</span>@主要目的是保存ExcContext中除<span class="token punctuation">(</span>R0<span class="token operator">~</span>R12<span class="token punctuation">)</span>的其他寄存器
    ADD     R0， SP， #<span class="token punctuation">(</span><span class="token number">4</span> <span class="token operator">*</span> <span class="token number">16</span><span class="token punctuation">)</span>	@跳转到保存PC，LR，SP的位置，此时R0位置刚好是SP的位置
    MOV     R5， R0				@由R5记录SP位置，因为R0要暂时充当SP寄存器来使用
    STMFD   R0<span class="token operator">!</span>， <span class="token punctuation">{</span>R4<span class="token punctuation">}</span>                                        @ Store PC <span class="token operator">=</span><span class="token operator">&gt;</span> ExcContext<span class="token punctuation">.</span>PC
    STMFD   R0<span class="token operator">!</span>， <span class="token punctuation">{</span>R4<span class="token punctuation">}</span>										 @ 相当于保存了<span class="token operator">=</span><span class="token operator">&gt;</span>  ExcContext<span class="token punctuation">.</span>LR
    STMFD   R0<span class="token operator">!</span>， <span class="token punctuation">{</span>R5<span class="token punctuation">}</span>										 @ 相当于保存了<span class="token operator">=</span><span class="token operator">&gt;</span>  ExcContext<span class="token punctuation">.</span>SP

    STMFD   SP<span class="token operator">!</span>， <span class="token punctuation">{</span>R3<span class="token punctuation">}</span>                                        @ Push task`s <span class="token function">CPSR</span> <span class="token punctuation">(</span>i<span class="token punctuation">.</span>e<span class="token punctuation">.</span> exception SPSR<span class="token punctuation">)</span><span class="token punctuation">.</span> <span class="token operator">=</span><span class="token operator">&gt;</span>ExcContext<span class="token punctuation">.</span>regPSR
    SUB     SP， SP， #<span class="token punctuation">(</span><span class="token number">4</span> <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">)</span>                                 @ user sp and lr <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token operator">=</span><span class="token operator">&gt;</span>ExcContext<span class="token punctuation">.</span>USP，ULR

    MOV     R0， #OS_EXCEPT_SWI                               @ Set exception ID to OS_EXCEPT_SWI<span class="token punctuation">.</span>
															 @ 设置异常ID为软中断
    B       _osExceptionSwi                                  @ Branch to global exception handler<span class="token punctuation">.</span>
															 @ 跳到全局异常处理
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br></div></div><p><strong>解读</strong></p> <ul><li>运行到此处，已经切到SVC的栈运行，所以先保存上一个模式的现场</li> <li>获取中断模式，软中断的来源可不一定是用户模式，完全有可能是SVC本身，比如系统调用中又发生系统调用。就变成了从SVC模式切到SVC的模式</li> <li><code>MOV R0， SP</code> ;sp将作为参数传递给<code>OsArmA32SyscallHandle</code></li> <li>调用 <code>OsArmA32SyscallHandle</code> 这是所有系统调用的统一入口</li> <li>注意看<code>OsArmA32SyscallHandle</code>的参数 <code>UINT32 *regs</code></li></ul> <h3 id="_6-osarma32syscallhandle">6. OsArmA32SyscallHandle</h3> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token comment">/* The SYSCALL ID is in R7 on entry.  Parameters follow in R0..R6 */</span>
<span class="token comment">/******************************************************************
由汇编调用，见于 los_hw_exc.S    / BLX    OsArmA32SyscallHandle
SYSCALL是产生系统调用时触发的信号，R7寄存器存放具体的系统调用ID，也叫系统调用号
regs:参数就是所有寄存器
注意:本函数在用户态和内核态下都可能被调用到
//MOV     R0， SP @获取SP值，R0将作为OsArmA32SyscallHandle的参数
******************************************************************/</span>
LITE_OS_SEC_TEXT UINT32 <span class="token operator">*</span><span class="token function">OsArmA32SyscallHandle</span><span class="token punctuation">(</span>UINT32 <span class="token operator">*</span>regs<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    UINT32 ret<span class="token punctuation">;</span>
    UINT8 nArgs<span class="token punctuation">;</span>
    UINTPTR handle<span class="token punctuation">;</span>
    UINT32 cmd <span class="token operator">=</span> regs<span class="token punctuation">[</span>REG_R7<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment">//C7寄存器记录了触发了具体哪个系统调用</span>
	
    <span class="token keyword">if</span> <span class="token punctuation">(</span>cmd <span class="token operator">&gt;=</span> SYS_CALL_NUM<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//系统调用的总数</span>
        <span class="token function">PRINT_ERR</span><span class="token punctuation">(</span><span class="token string">&quot;Syscall ID: error %d !!!\n&quot;</span>， cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> regs<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span>cmd <span class="token operator">==</span> __NR_sigreturn<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//收到 __NR_sigreturn 信号</span>
        <span class="token function">OsRestorSignalContext</span><span class="token punctuation">(</span>regs<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//恢复信号上下文</span>
        <span class="token keyword">return</span> regs<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    handle <span class="token operator">=</span> g_syscallHandle<span class="token punctuation">[</span>cmd<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment">//拿到系统调用的注册函数，类似 SysRead </span>
    nArgs <span class="token operator">=</span> g_syscallNArgs<span class="token punctuation">[</span>cmd <span class="token operator">/</span> NARG_PER_BYTE<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">/* 4bit per nargs */</span>
    nArgs <span class="token operator">=</span> <span class="token punctuation">(</span>cmd <span class="token operator">&amp;</span> <span class="token number">1</span><span class="token punctuation">)</span> ？ <span class="token punctuation">(</span>nArgs <span class="token operator">&gt;&gt;</span> NARG_BITS<span class="token punctuation">)</span> ：<span class="token punctuation">(</span>nArgs <span class="token operator">&amp;</span> NARG_MASK<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//获取参数个数</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>handle <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span>nArgs <span class="token operator">&gt;</span> ARG_NUM_7<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//系统调用必须有参数且参数不能大于8个</span>
        <span class="token function">PRINT_ERR</span><span class="token punctuation">(</span><span class="token string">&quot;Unsupport syscall ID: %d nArgs: %d\n&quot;</span>， cmd， nArgs<span class="token punctuation">)</span><span class="token punctuation">;</span>
        regs<span class="token punctuation">[</span>REG_R0<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">-</span>ENOSYS<span class="token punctuation">;</span>
        <span class="token keyword">return</span> regs<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
	<span class="token comment">//regs[0-6] 记录系统调用的参数，这也是由R7寄存器保存系统调用号的原因</span>
    <span class="token keyword">switch</span> <span class="token punctuation">(</span>nArgs<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//参数的个数 </span>
        <span class="token keyword">case</span> ARG_NUM_0<span class="token operator">:</span>
        <span class="token keyword">case</span> ARG_NUM_1<span class="token operator">:</span>
            ret <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">(</span>SyscallFun1<span class="token punctuation">)</span>handle<span class="token punctuation">)</span><span class="token punctuation">(</span>regs<span class="token punctuation">[</span>REG_R0<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//执行系统调用，类似 SysUnlink(pathname);</span>
            <span class="token keyword">break</span><span class="token punctuation">;</span>
        <span class="token keyword">case</span> ARG_NUM_2<span class="token operator">:</span><span class="token comment">//如何是两个参数的系统调用，这里传三个参数也没有问题，因被调用函数不会去取用R2值</span>
        <span class="token keyword">case</span> ARG_NUM_3<span class="token operator">:</span>
            ret <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">(</span>SyscallFun3<span class="token punctuation">)</span>handle<span class="token punctuation">)</span><span class="token punctuation">(</span>regs<span class="token punctuation">[</span>REG_R0<span class="token punctuation">]</span>， regs<span class="token punctuation">[</span>REG_R1<span class="token punctuation">]</span>， regs<span class="token punctuation">[</span>REG_R2<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//类似 SysExecve(fileName， argv， envp);</span>
            <span class="token keyword">break</span><span class="token punctuation">;</span>
        <span class="token keyword">case</span> ARG_NUM_4<span class="token operator">:</span>
        <span class="token keyword">case</span> ARG_NUM_5<span class="token operator">:</span>
            ret <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">(</span>SyscallFun5<span class="token punctuation">)</span>handle<span class="token punctuation">)</span><span class="token punctuation">(</span>regs<span class="token punctuation">[</span>REG_R0<span class="token punctuation">]</span>， regs<span class="token punctuation">[</span>REG_R1<span class="token punctuation">]</span>， regs<span class="token punctuation">[</span>REG_R2<span class="token punctuation">]</span>， regs<span class="token punctuation">[</span>REG_R3<span class="token punctuation">]</span>，
                                         regs<span class="token punctuation">[</span>REG_R4<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">break</span><span class="token punctuation">;</span>
        <span class="token keyword">default</span><span class="token operator">:</span>	<span class="token comment">//7个参数的情况</span>
            ret <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">(</span>SyscallFun7<span class="token punctuation">)</span>handle<span class="token punctuation">)</span><span class="token punctuation">(</span>regs<span class="token punctuation">[</span>REG_R0<span class="token punctuation">]</span>， regs<span class="token punctuation">[</span>REG_R1<span class="token punctuation">]</span>， regs<span class="token punctuation">[</span>REG_R2<span class="token punctuation">]</span>， regs<span class="token punctuation">[</span>REG_R3<span class="token punctuation">]</span>，
                                         regs<span class="token punctuation">[</span>REG_R4<span class="token punctuation">]</span>， regs<span class="token punctuation">[</span>REG_R5<span class="token punctuation">]</span>， regs<span class="token punctuation">[</span>REG_R6<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    regs<span class="token punctuation">[</span>REG_R0<span class="token punctuation">]</span> <span class="token operator">=</span> ret<span class="token punctuation">;</span><span class="token comment">//R0保存系统调用返回值</span>
    <span class="token function">OsSaveSignalContext</span><span class="token punctuation">(</span>regs<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//保存信号上下文现场</span>

    <span class="token comment">/* Return the last value of curent_regs.  This supports context switches on return from the exception.
     * That capability is only used with theSYS_context_switch system call.
     */</span>
    <span class="token keyword">return</span> regs<span class="token punctuation">;</span><span class="token comment">//返回寄存器的值</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br></div></div><p><strong>解读</strong></p> <ul><li>参数是<code>regs</code>对应的就是R0~Rn</li> <li>R7保存的是系统调用号，R0~R3保存的是 <code>SysMqOpen</code>的四个参数</li> <li><code>g_syscallHandle[cmd]</code>就能查询到 <code>SYSCALL_HAND_DEF(__NR_mq_open， SysMqOpen， mqd_t， ARG_NUM_4)</code>注册时对应的 <code>SysMqOpen</code>函数</li> <li><code>*(SyscallFun5)handle</code>此时就是<code>SysMqOpen</code></li> <li>注意看 SysMqOpen 的参数是最开始的 <code>main</code>函数中的
<code>mqdes = mq_open(mqname， O_CREAT | O_RDWR， S_IRUSR | S_IWUSR， &amp;attr);</code>
由此完成了真正系统调用的过程</li></ul> <h3 id="_7-sysmqopen">7. SysMqOpen</h3> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token class-name">mqd_t</span> <span class="token function">SysMqOpen</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>mqName， <span class="token keyword">int</span> openFlag， <span class="token class-name">mode_t</span> mode， <span class="token keyword">struct</span> <span class="token class-name">mq_attr</span> <span class="token operator">*</span>attr<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token class-name">mqd_t</span> ret<span class="token punctuation">;</span>
    <span class="token keyword">int</span> retValue<span class="token punctuation">;</span>
    <span class="token keyword">char</span> kMqName<span class="token punctuation">[</span>PATH_MAX <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>

    retValue <span class="token operator">=</span> <span class="token function">LOS_StrncpyFromUser</span><span class="token punctuation">(</span>kMqName， mqName， PATH_MAX<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>retValue <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> retValue<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    ret <span class="token operator">=</span> <span class="token function">mq_open</span><span class="token punctuation">(</span>kMqName， openFlag， mode， attr<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//一个消息队列可以有多个进程向它读写消息</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token class-name">mqd_t</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token function">get_errno</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> ret<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br></div></div><p><strong>解读</strong></p> <ul><li>此处的<code>mq_open</code>和main函数的<code>mq_open</code>其实是两个函数体实现。一个是给应用层的调用，一个是内核层使用，只是名字一样而已。</li> <li><code>SysMqOpen</code>是返回到 <code>OsArmA32SyscallHandle</code> <code>regs[REG_R0] = ret;</code></li> <li><code>OsArmA32SyscallHandle</code>再返回到 <code>_osExceptSwiHdl</code></li> <li><code>_osExceptSwiHdl</code>后面的代码是用于恢复用户模式现场和<code>SPSR</code>，<code>PC</code> 等寄存器。</li></ul> <p>以上为鸿蒙系统调用的整个过程。<br>
关于寄存器(R0~R15)在每种模式下的使用方式，后续将由其他篇详细说明，敬请关注。</p> <h3 id="百文说内核-抓住主脉络">百文说内核 | 抓住主脉络</h3> <ul><li>百文相当于摸出内核的肌肉和器官系统，让人开始丰满有立体感，因是直接从注释源码起步，在加注释过程中，每每有心得处就整理,慢慢形成了以下文章。内容立足源码，常以生活场景打比方尽可能多的将内核知识点置入某种场景，具有画面感，容易理解记忆。说别人能听得懂的话很重要! 百篇博客绝不是百度教条式的在说一堆诘屈聱牙的概念，那没什么意思。更希望让内核变得栩栩如生，倍感亲切。</li> <li>与代码需不断<code>debug</code>一样，文章内容会存在不少错漏之处，请多包涵，但会反复修正，持续更新，<code>v**.xx</code> 代表文章序号和修改的次数，精雕细琢，言简意赅，力求打造精品内容。</li> <li>百文在 &lt; 鸿蒙研究站 | 开源中国 | 博客园 | 51cto | csdn | 知乎 | 掘金 &gt; 站点发布，百篇博客系列目录如下。</li> <li><img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/common/cate.png" alt=""></li></ul> <p>按功能模块:</p> <table><thead><tr><th style="text-align:center;">基础知识</th> <th style="text-align:center;">进程管理</th> <th style="text-align:center;">任务管理</th> <th style="text-align:center;">内存管理</th></tr></thead> <tbody><tr><td style="text-align:center;"><a href="http://weharmonyos.com/blog/01.html" target="_blank" rel="noopener noreferrer">双向链表</a><br><a href="http://weharmonyos.com/blog/02.html" target="_blank" rel="noopener noreferrer">内核概念</a><br><a href="http://weharmonyos.com/blog/03.html" target="_blank" rel="noopener noreferrer">源码结构</a><br><a href="http://weharmonyos.com/blog/04.html" target="_blank" rel="noopener noreferrer">地址空间</a><br><a href="http://weharmonyos.com/blog/05.html" target="_blank" rel="noopener noreferrer">计时单位</a><br><a href="http://weharmonyos.com/blog/06.html" target="_blank" rel="noopener noreferrer">优雅的宏</a><br><a href="http://weharmonyos.com/blog/07.html" target="_blank" rel="noopener noreferrer">钩子框架</a><br><a href="http://weharmonyos.com/blog/08.html" target="_blank" rel="noopener noreferrer">位图管理</a><br><a href="http://weharmonyos.com/blog/09.html" target="_blank" rel="noopener noreferrer">POSIX</a><br><a href="http://weharmonyos.com/blog/10.html" target="_blank" rel="noopener noreferrer">main函数</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/11.html" target="_blank" rel="noopener noreferrer">调度故事</a><br><a href="http://weharmonyos.com/blog/12.html" target="_blank" rel="noopener noreferrer">进程控制块</a><br><a href="http://weharmonyos.com/blog/13.html" target="_blank" rel="noopener noreferrer">进程空间</a><br><a href="http://weharmonyos.com/blog/14.html" target="_blank" rel="noopener noreferrer">线性区</a><br><a href="http://weharmonyos.com/blog/15.html" target="_blank" rel="noopener noreferrer">红黑树</a><br><a href="http://weharmonyos.com/blog/16.html" target="_blank" rel="noopener noreferrer">进程管理</a><br><a href="http://weharmonyos.com/blog/17.html" target="_blank" rel="noopener noreferrer">Fork进程</a><br><a href="http://weharmonyos.com/blog/18.html" target="_blank" rel="noopener noreferrer">进程回收</a><br><a href="http://weharmonyos.com/blog/19.html" target="_blank" rel="noopener noreferrer">Shell编辑</a><br><a href="http://weharmonyos.com/blog/20.html" target="_blank" rel="noopener noreferrer">Shell解析</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/21.html" target="_blank" rel="noopener noreferrer">任务控制块</a><br><a href="http://weharmonyos.com/blog/22.html" target="_blank" rel="noopener noreferrer">并发并行</a><br><a href="http://weharmonyos.com/blog/23.html" target="_blank" rel="noopener noreferrer">就绪队列</a><br><a href="http://weharmonyos.com/blog/24.html" target="_blank" rel="noopener noreferrer">调度机制</a><br><a href="http://weharmonyos.com/blog/25.html" target="_blank" rel="noopener noreferrer">任务管理</a><br><a href="http://weharmonyos.com/blog/26.html" target="_blank" rel="noopener noreferrer">用栈方式</a><br><a href="http://weharmonyos.com/blog/27.html" target="_blank" rel="noopener noreferrer">软件定时器</a><br><a href="http://weharmonyos.com/blog/28.html" target="_blank" rel="noopener noreferrer">控制台</a><br><a href="http://weharmonyos.com/blog/29.html" target="_blank" rel="noopener noreferrer">远程登录</a><br><a href="http://weharmonyos.com/blog/30.html" target="_blank" rel="noopener noreferrer">协议栈</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/31.html" target="_blank" rel="noopener noreferrer">内存规则</a><br><a href="http://weharmonyos.com/blog/32.html" target="_blank" rel="noopener noreferrer">物理内存</a><br><a href="http://weharmonyos.com/blog/33.html" target="_blank" rel="noopener noreferrer">内存概念</a><br><a href="http://weharmonyos.com/blog/34.html" target="_blank" rel="noopener noreferrer">虚实映射</a><br><a href="http://weharmonyos.com/blog/35.html" target="_blank" rel="noopener noreferrer">页表管理</a><br><a href="http://weharmonyos.com/blog/36.html" target="_blank" rel="noopener noreferrer">静态分配</a><br><a href="http://weharmonyos.com/blog/37.html" target="_blank" rel="noopener noreferrer">TLFS算法</a><br><a href="http://weharmonyos.com/blog/38.html" target="_blank" rel="noopener noreferrer">内存池管理</a><br><a href="http://weharmonyos.com/blog/39.html" target="_blank" rel="noopener noreferrer">原子操作</a><br><a href="http://weharmonyos.com/blog/40.html" target="_blank" rel="noopener noreferrer">圆整对齐</a><br></td></tr> <tr><td style="text-align:center;">通讯机制</td> <td style="text-align:center;">文件系统</td> <td style="text-align:center;">硬件架构</td> <td style="text-align:center;">内核汇编</td></tr> <tr><td style="text-align:center;"><a href="http://weharmonyos.com/blog/41.html" target="_blank" rel="noopener noreferrer">通讯总览</a><br><a href="http://weharmonyos.com/blog/42.html" target="_blank" rel="noopener noreferrer">自旋锁</a><br><a href="http://weharmonyos.com/blog/43.html" target="_blank" rel="noopener noreferrer">互斥锁</a><br><a href="http://weharmonyos.com/blog/44.html" target="_blank" rel="noopener noreferrer">快锁使用</a><br><a href="http://weharmonyos.com/blog/45.html" target="_blank" rel="noopener noreferrer">快锁实现</a><br><a href="http://weharmonyos.com/blog/46.html" target="_blank" rel="noopener noreferrer">读写锁</a><br><a href="http://weharmonyos.com/blog/47.html" target="_blank" rel="noopener noreferrer">信号量</a><br><a href="http://weharmonyos.com/blog/48.html" target="_blank" rel="noopener noreferrer">事件机制</a><br><a href="http://weharmonyos.com/blog/49.html" target="_blank" rel="noopener noreferrer">信号生产</a><br><a href="http://weharmonyos.com/blog/50.html" target="_blank" rel="noopener noreferrer">信号消费</a><br><a href="http://weharmonyos.com/blog/51.html" target="_blank" rel="noopener noreferrer">消息队列</a><br><a href="http://weharmonyos.com/blog/52.html" target="_blank" rel="noopener noreferrer">消息封装</a><br><a href="http://weharmonyos.com/blog/53.html" target="_blank" rel="noopener noreferrer">消息映射</a><br><a href="http://weharmonyos.com/blog/54.html" target="_blank" rel="noopener noreferrer">共享内存</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/55.html" target="_blank" rel="noopener noreferrer">文件概念</a><br><a href="http://weharmonyos.com/blog/56.html" target="_blank" rel="noopener noreferrer">文件故事</a><br><a href="http://weharmonyos.com/blog/57.html" target="_blank" rel="noopener noreferrer">索引节点</a><br><a href="http://weharmonyos.com/blog/58.html" target="_blank" rel="noopener noreferrer">VFS</a><br><a href="http://weharmonyos.com/blog/59.html" target="_blank" rel="noopener noreferrer">文件句柄</a><br><a href="http://weharmonyos.com/blog/60.html" target="_blank" rel="noopener noreferrer">根文件系统</a><br><a href="http://weharmonyos.com/blog/61.html" target="_blank" rel="noopener noreferrer">挂载机制</a><br><a href="http://weharmonyos.com/blog/62.html" target="_blank" rel="noopener noreferrer">管道文件</a><br><a href="http://weharmonyos.com/blog/63.html" target="_blank" rel="noopener noreferrer">文件映射</a><br><a href="http://weharmonyos.com/blog/64.html" target="_blank" rel="noopener noreferrer">写时拷贝</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/65.html" target="_blank" rel="noopener noreferrer">芯片模式</a><br><a href="http://weharmonyos.com/blog/66.html" target="_blank" rel="noopener noreferrer">ARM架构</a><br><a href="http://weharmonyos.com/blog/67.html" target="_blank" rel="noopener noreferrer">指令集</a><br><a href="http://weharmonyos.com/blog/68.html" target="_blank" rel="noopener noreferrer">协处理器</a><br><a href="http://weharmonyos.com/blog/69.html" target="_blank" rel="noopener noreferrer">工作模式</a><br><a href="http://weharmonyos.com/blog/70.html" target="_blank" rel="noopener noreferrer">寄存器</a><br><a href="http://weharmonyos.com/blog/71.html" target="_blank" rel="noopener noreferrer">多核管理</a><br><a href="http://weharmonyos.com/blog/72.html" target="_blank" rel="noopener noreferrer">中断概念</a><br><a href="http://weharmonyos.com/blog/73.html" target="_blank" rel="noopener noreferrer">中断管理</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/74.html" target="_blank" rel="noopener noreferrer">编码方式</a><br><a href="http://weharmonyos.com/blog/75.html" target="_blank" rel="noopener noreferrer">汇编基础</a><br><a href="http://weharmonyos.com/blog/76.html" target="_blank" rel="noopener noreferrer">汇编传参</a><br><a href="http://weharmonyos.com/blog/77.html" target="_blank" rel="noopener noreferrer">链接脚本</a><br><a href="http://weharmonyos.com/blog/78.html" target="_blank" rel="noopener noreferrer">内核启动</a><br><a href="http://weharmonyos.com/blog/79.html" target="_blank" rel="noopener noreferrer">进程切换</a><br><a href="http://weharmonyos.com/blog/80.html" target="_blank" rel="noopener noreferrer">任务切换</a><br><a href="http://weharmonyos.com/blog/81.html" target="_blank" rel="noopener noreferrer">中断切换</a><br><a href="http://weharmonyos.com/blog/82.html" target="_blank" rel="noopener noreferrer">异常接管</a><br><a href="http://weharmonyos.com/blog/83.html" target="_blank" rel="noopener noreferrer">缺页中断</a><br></td></tr> <tr><td style="text-align:center;">编译运行</td> <td style="text-align:center;">调测工具</td> <td style="text-align:center;"></td> <td style="text-align:center;"></td></tr> <tr><td style="text-align:center;"><a href="http://weharmonyos.com/blog/84.html" target="_blank" rel="noopener noreferrer">编译过程</a><br><a href="http://weharmonyos.com/blog/85.html" target="_blank" rel="noopener noreferrer">编译构建</a><br><a href="http://weharmonyos.com/blog/86.html" target="_blank" rel="noopener noreferrer">GN语法</a><br><a href="http://weharmonyos.com/blog/87.html" target="_blank" rel="noopener noreferrer">忍者无敌</a><br><a href="http://weharmonyos.com/blog/88.html" target="_blank" rel="noopener noreferrer">ELF格式</a><br><a href="http://weharmonyos.com/blog/89.html" target="_blank" rel="noopener noreferrer">ELF解析</a><br><a href="http://weharmonyos.com/blog/90.html" target="_blank" rel="noopener noreferrer">静态链接</a><br><a href="http://weharmonyos.com/blog/91.html" target="_blank" rel="noopener noreferrer">重定位</a><br><a href="http://weharmonyos.com/blog/92.html" target="_blank" rel="noopener noreferrer">动态链接</a><br><a href="http://weharmonyos.com/blog/93.html" target="_blank" rel="noopener noreferrer">进程映像</a><br><a href="http://weharmonyos.com/blog/94.html" target="_blank" rel="noopener noreferrer">应用启动</a><br><a href="http://weharmonyos.com/blog/95.html" target="_blank" rel="noopener noreferrer">系统调用</a><br><a href="http://weharmonyos.com/blog/96.html" target="_blank" rel="noopener noreferrer">VDSO</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/97.html" target="_blank" rel="noopener noreferrer">模块监控</a><br><a href="http://weharmonyos.com/blog/98.html" target="_blank" rel="noopener noreferrer">日志跟踪</a><br><a href="http://weharmonyos.com/blog/99.html" target="_blank" rel="noopener noreferrer">系统安全</a><br><a href="http://weharmonyos.com/blog/100.html" target="_blank" rel="noopener noreferrer">测试用例</a><br></td> <td style="text-align:center;"></td> <td style="text-align:center;"></td></tr></tbody></table> <h3 id="百万注源码-处处扣细节">百万注源码 | 处处扣细节</h3> <ul><li><p>百万汉字注解内核目的是要看清楚其毛细血管，细胞结构，等于在拿放大镜看内核。内核并不神秘，带着问题去源码中找答案是很容易上瘾的，你会发现很多文章对一些问题的解读是错误的，或者说不深刻难以自圆其说，你会慢慢形成自己新的解读，而新的解读又会碰到新的问题，如此层层递进，滚滚向前，拿着放大镜根本不愿意放手。</p></li> <li><p><a href="https://gitee.com/weharmony/kernel_liteos_a_note" target="_blank" rel="noopener noreferrer">&lt; gitee</a> | <a href="https://github.com/kuangyufei/kernel_liteos_a_note" target="_blank" rel="noopener noreferrer">github</a> | <a href="https://weharmony.coding.net/public/harmony/kernel_liteos_a_note/git/files" target="_blank" rel="noopener noreferrer">coding</a> | <a href="https://gitcode.net/kuangyufei/kernel_liteos_a_note" target="_blank" rel="noopener noreferrer">gitcode &gt;</a> 四大码仓推送 | 同步官方源码。</p> <p><a href="https://gitee.com/weharmony/kernel_liteos_a_note" target="_blank" rel="noopener noreferrer"><img src="https://gitee.com/weharmony/kernel_liteos_a_note/widgets/widget_card.svg?colors=393222,ebdfc1,fffae5,d8ca9f,393222,a28b40" alt=""></a></p></li></ul> <h3 id="关注不迷路-代码即人生">关注不迷路 | 代码即人生</h3> <p><img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/common/so1so.png" alt=""></p> <ul><li>互联网从业十五年，计算机硕士，技术副总裁</li> <li>关注我，持续更新四十年，即聊技术也聊人生</li> <li>交有趣靠谱的人；做难而正确的事</li> <li>不做作，不炒作，只唯真</li> <li>不唯上，不唯书，只唯实</li></ul> <p><a href="http://weharmonyos.com/donate.html" target="_blank" rel="noopener noreferrer"> &gt;&gt; 捐助名单</a></p> <p>据说喜欢 <strong>点赞 + 分享</strong> 的,后来都成了大神。😃</p></div> <!----> <div class="content__content-bottom"></div> <footer class="page-meta"><!----> <!----> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev"><a href="/blog/94.html" class="prev"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon prev-icon"><path d="M906.783 588.79c-.02 8.499-6.882 15.36-15.38 15.37l-443.7-.01 75.704 191.682c2.52 6.42.482 13.763-5.038 17.91-5.52 4.168-13.138 4.147-18.616-.092L123.228 524.175a15.362 15.362 0 0 1-6-12.165c0-4.782 2.222-9.277 6-12.185L499.753 210.35a15.388 15.388 0 0 1 9.38-3.195c3.236 0 6.502 1.034 9.236 3.103 5.52 4.147 7.578 11.49 5.038 17.91L447.683 419.84l443.72-.01c8.498.01 15.36 6.881 15.36 15.36l.02 153.6z" fill="currentColor"></path></svg>
        应用启动
      </a></span> <span class="next"><a href="/blog/96.html">
        VDSO
        <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon next-icon"><path d="M906.772 512c0 4.772-2.211 9.267-5.99 12.175L524.257 813.66a15.37 15.37 0 0 1-18.616.092 15.368 15.368 0 0 1-5.038-17.91l75.714-191.672h-443.73c-8.488 0-15.36-6.881-15.36-15.36v-153.6c0-8.489 6.872-15.36 15.36-15.36h443.73l-75.714-191.682a15.358 15.358 0 0 1 5.048-17.91c5.51-4.158 13.128-4.137 18.606.092l376.525 289.485a15.323 15.323 0 0 1 5.99 12.165z" fill="currentColor"></path></svg></a></span></p></div> <!----> <!----> <div class="content__page-bottom"></div></main> <!----></div><div class="global-ui"><!----><!----><div id="pwa-install"><!----> <div id="install-modal-wrapper" style="display:none;"><div class="background"></div> <div class="install-modal"><div class="header"><button aria-label="Close" class="close-button"><svg width="23" height="22" xmlns="http://www.w3.org/2000/svg" class="icon close-icon"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.12.358a1.224 1.224 0 011.729 0l8.92 8.914L20.686.358a1.224 1.224 0 011.73 1.728L13.497 11l8.92 8.913a1.222 1.222 0 11-1.73 1.729l-8.919-8.913-8.92 8.913a1.224 1.224 0 01-1.729-1.729L10.04 11l-8.92-8.914a1.222 1.222 0 010-1.728z" fill="currentColor"></path></svg></button> <div class="logo"><!----> <div class="title"><h1></h1> <p class="desc">This app can be installed on your PC or mobile device.  This will allow this web app to look and behave like any other installed app.  You will find it in your app lists and be able to pin it to your home screen, start menus or task bars.  This installed web app will also be able to safely interact with other apps and your operating system. </p></div></div></div> <div class="content"><div class="highlight"><!----> <!----></div> <div class="description"><h3>Description</h3> <p></p></div></div> <div class="button-wrapper"><button class="install-button">
        Install <span></span></button> <button class="cancel-button">
        Cancel
      </button></div></div></div></div><div tabindex="-1" role="dialog" aria-hidden="true" class="pswp"><div class="pswp__bg"></div> <div class="pswp__scroll-wrap"><div class="pswp__container"><div class="pswp__item"></div> <div class="pswp__item"></div> <div class="pswp__item"></div></div> <div class="pswp__ui pswp__ui--hidden"><div class="pswp__top-bar"><div class="pswp__counter"></div> <button title="Close" aria-label="Close" class="pswp__button pswp__button--close"></button> <button title="Share" aria-label="Share" class="pswp__button pswp__button--share"></button> <button title="Switch to full screen" aria-label="Switch to full screen" class="pswp__button pswp__button--fs"></button> <button title="Zoom in/out" aria-label="Zoom in/out" class="pswp__button pswp__button--zoom"></button> <div class="pswp__preloader"><div class="pswp__preloader__icn"><div class="pswp__preloader__cut"><div class="pswp__preloader__donut"></div></div></div></div></div> <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"><div class="pswp__share-tooltip"></div></div> <button title="Prev (Arrow Left)" aria-label="Prev (Arrow Left)" class="pswp__button pswp__button--arrow--left"></button> <button title="Next (Arrow Right)" aria-label="Next (Arrow Right)" class="pswp__button pswp__button--arrow--right"></button> <div class="pswp__caption"><div class="pswp__caption__center"></div></div></div></div></div></div></div>
    <script src="/assets/js/app.9a8b95d8.js" defer></script><script src="/assets/js/vendors~layout-Layout.c1e797d4.js" defer></script><script src="/assets/js/vendors~layout-Blog~layout-Layout~layout-NotFound.f75cf258.js" defer></script><script src="/assets/js/page--6c2b97f0.ed46abea.js" defer></script>
  </body>
</html>
